package hibernate.jaiku.dao.imp;

import hibernate.jaiku.dao.UsuarioDao;
import hibernate.jaiku.modelo.Entrada;
import hibernate.jaiku.modelo.Usuario;
import hibernate.jaiku.utils.HibernateUtil;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;


public class UsuarioHibernate implements UsuarioDao {

	private static String ENTRADAS_DE_USUARIO = "SELECT e FROM Entrada e WHERE e.id=?";

	public void nuevoUsuario(Usuario usuario) throws Exception {

		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction tx = null;

		try {
			tx = session.beginTransaction();
			session.save(usuario);
			tx.commit();
		} catch (Exception e) {
			if (tx != null)
				tx.rollback();
			throw e;
		} finally {
			session.close();
		}

	}

	public void actualizarUsuario(Usuario usuario) throws Exception {

		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction tx = null;

		try {
			tx = session.beginTransaction();
			session.merge(usuario);
			// session.flush(); //Sino hay tx y no hacemos flush, nunca se va a actualizar.
			// http://www.hibernate.org/hib_docs/v3/reference/en/html/objectstate.html#objectstate-flushing
			tx.commit();
		} catch (Exception e) {
			if (tx != null)
				tx.rollback();
			throw e;
		} finally {
			session.close();
		}

	}

	@SuppressWarnings("unchecked")
	public List<Entrada> entradasUsuario(Usuario usuario) throws Exception {

		Session session = HibernateUtil.getSessionFactory().openSession();
		List<Entrada> entradas = null;
		Transaction tx = null;

		try {
			tx = session.beginTransaction();
			Long id = usuario.getId();
			entradas = session.createQuery(ENTRADAS_DE_USUARIO).setParameter(0, id).list();
			tx.commit();
		} catch (Exception e) {
			if (tx != null)
				tx.rollback();
			throw e;
		} finally {
			session.close();
		}

		return entradas;

	}

}
